﻿#pragma once
#include "afx.h"
#include "afxmt.h"

class CMemPoolUnit;

class CMemPool :
	public CObject
{
public:
	CMemPool(int unitSize, int unitPerBlock);
	~CMemPool(void);

	// 获取一个可用的内存块
	void alloc(CMemPoolUnit ** pUnit);

	// 释放一个块
	void free(CMemPoolUnit * pUnit);

protected:
	const int	m_unitSize;		    //每个单元的字节数，分配时候，代表一个类对象
	const int	m_unitCountPerBlock;	   //每个块中有多少个单元
	const int	m_poolID;			// 当前内存池的ID，是一个整数

	int			m_usableBlockCount; //可用的内存快
	int			m_totalBlockCount;	//内存池的总块数

	CPtrArray	m_allBlocks;	// 存放所有内存块的起始地址的数组
	CList<int>	m_usableBlocks;	// 可用内存块偏移列表

	// 生成一个可用块
	void allocBlock();

	// 唯一Pool标示，全局的内存池ID。
	static int				thePoolID;
	static CCriticalSection	theCs;  //用于生成全局内存ID。

	//用于获取当前内存池的可用的单元块。
	CCriticalSection	rw_Cs;

	//为当前内存池分配ID,并生成新的内存池ID为下次内存池的申请备用。
	static int getPoolID()
	{
		int	i;
		theCs.Lock();
		i = thePoolID++;
		theCs.Unlock();
		return i;
	};
};
